package jp.co.jolystar.product.activity;

import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import jp.co.jolystar.product.R;
import jp.co.jolystar.product.view.NeedleView;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.GeomagneticField;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;

public class TargetCompassActivity extends Activity implements
        LocationListener, SensorEventListener {
    /**
     * 現在地緯度
     */
    double doubleCurrentLatitude = -1.0;
    /**
     * 現在地経度
     */
    double doubleCurrentLongitude = -1.0;
    /**
     * 目的地緯度
     */
    double doubleTargetLatitude = -1.0;
    /**
     * 目的地経度
     */
    double doubleTargetLongitude = -1.0;
    /**
     * マネージャー
     */
    LocationManager locationManager;
    SensorManager sensorManager;
    /**
     * 方位
     */
    GeomagneticField geomagnetic = null;
    float northAngle = 0.0f;
    float toTargetAngle = 0.0f;
    float fromTargetAngle = 0.0f;
    /**
     * データの共有と保存
     */
    public SharedPreferences sharedPreferences;
    /**
     * ログ出力用タグ
     */
    String tag = "TargetCompassActivity";

    NeedleView needleView = null;
    /** Timer 処理用のハンドラ */
    Handler handler = new Handler();

    /** OpenGL用 **/
    GLSurfaceView mGLSurfaceView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        // LocationManagerの取得
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // SensorManagerの取得
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // SharedPreferencesオブジェクトの取得
        sharedPreferences = getSharedPreferences("TargetCompass",
                Context.MODE_PRIVATE);
    }

    /**
     * アクティビティがユーザとやり取りを開始する直前に実行
     */
    @Override
    public void onResume() {
        super.onResume();

        // GPSから現在地の情報を取得
        List<String> providers = locationManager.getProviders(true);
        for (String provider : providers) {
            locationManager.requestLocationUpdates(provider, 1000, 10, this);
        }

        // 方位センサーを指定してSensorインスタンスを取得
        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        sensorManager.registerListener(this, sensor,
                SensorManager.SENSOR_DELAY_NORMAL);

        // SharedPreferencesから目的地の座標を取得
        doubleTargetLatitude = Double.valueOf(
                sharedPreferences.getString("doubleTargetLatitude", "-1"))
                .doubleValue();
        doubleTargetLongitude = Double.valueOf(
                sharedPreferences.getString("doubleTargetLongitude", "-1"))
                .doubleValue();

        needleView = (NeedleView) findViewById(R.id.needleView1);
        // Timer の設定をする
        Timer timer = new Timer(false);
        timer.schedule(new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        needleView.invalidate();
                    }
                });
            }
        }, 10, 1);
    }

    /**
     * アクティビティがバックグラウンドに隠れる直前に実行
     */
    @Override
    public void onPause() {
        super.onPause();

        // ロケーションリスナーを解除
        locationManager.removeUpdates(this);
        // センサーリスナーを解除
        sensorManager.unregisterListener(this);
    }

    /**
     * メニュー表示
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * メニューが選択されたときの処理を行うメソッド
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // 選択されたIDで振り分け
        switch (item.getItemId()) {
        // 目的地指定が押されたとき
        case R.id.setting:
            Intent intentTargetSetting = new Intent(TargetCompassActivity.this,
                    TargetSettingActivity.class);
            startActivity(intentTargetSetting);
            break;
        // HELPが押されたとき
        // case R.id.help:
        // Intent intentHelp = new Intent(TargetCompassActivity.this,
        // HelpActivity.class);
        // startActivity(intentHelp);
        // break;
        }
        return true;
    }

    @Override
    public void onSensorChanged(SensorEvent e) {
        switch (e.sensor.getType()) {
        // センサータイプが方位センサーの場合
        case Sensor.TYPE_ORIENTATION:
            float magneticNorth = e.values[SensorManager.DATA_X];
            if (geomagnetic != null) {
                // 真北
                northAngle = magneticNorth + geomagnetic.getDeclination();
            } else {
                // 磁北
                northAngle = magneticNorth;
            }

            float[] results = { 0, 0, 0 };
            if (doubleTargetLatitude >= 0) {
                Location.distanceBetween(doubleCurrentLatitude,
                        doubleCurrentLongitude, doubleTargetLatitude,
                        doubleTargetLongitude, results);
                toTargetAngle = results[1] - northAngle;
            }
            needleView.setAngle(toTargetAngle);
            break;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void onLocationChanged(Location location) {
        // 緯度の取得
        doubleCurrentLatitude = location.getLatitude();
        // 経度の取得
        doubleCurrentLongitude = location.getLongitude();
        // 方位用磁気偏角の取得
        geomagnetic = new GeomagneticField((float) doubleCurrentLatitude,
                (float) doubleCurrentLongitude, (float) location.getAltitude(),
                new Date().getTime());
    }

    @Override
    public void onProviderDisabled(String s) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void onProviderEnabled(String s) {
        // TODO 自動生成されたメソッド・スタブ

    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {
        // TODO 自動生成されたメソッド・スタブ

    }
}